""" 
如何跨域请求web端的接口呢？
https://fundgz.1234567.com.cn/js/007467.js
读取返回值中jsonpgz({})中的json内容，当然返回值也能是空只有jsonpgz()
"""

import requests
import re
import json
from typing import Optional, Dict

def fetch_fund_jsonp(fund_code: str = "007467", 
                    api_url: str = "https://fundgz.1234567.com.cn/js/{fund_code}.js") -> Optional[Dict]:
    """
    获取基金JSONP接口数据
    
    Args:
        fund_code: 基金代码，如007467
        api_url: 接口模板，支持{fund_code}占位符
    
    Returns:
        解析后的JSON数据，或None（如果请求失败/返回空）
    """
    try:
        # 1. 发送GET请求（无需处理CORS）
        url = api_url.format(fund_code=fund_code)
        headers = {
            'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) FundAnalyzer/1.0',
            'Accept': '*/*',
            'Referer': 'https://www.1234567.com.cn/'
        }
        response = requests.get(url, headers=headers, timeout=10)
        response.raise_for_status()  # 检查HTTP错误

        # 2. 获取原始文本
        content = response.text.strip()
        
        # 3. 检查是否为空或无效内容
        if not content or 'jsonpgz()' in content or 'jsonpgz(})' in content:
            print("接口返回空数据")
            return None
            
        # 4. 使用正则提取JSONP数据
        pattern = r'jsonpgz$(.*?)$'
        match = re.search(pattern, content, re.DOTALL)
        
        if match:
            json_str = match.group(1).strip()
            if json_str and json_str not in ['}', '];']:  # 排除只有括号的情况
                return json.loads(json_str)
            else:
                return None
        else:
            print("未找到jsonpgz()调用")
            return None
            
    except requests.exceptions.RequestException as e:
        print(f"请求失败: {e}")
        return None
    except json.JSONDecodeError as e:
        print(f"JSON解析失败: {e}")
        print(f"原始返回: {response.text if 'response' in locals() else ''}")
        return None

# 使用示例
data = fetch_fund_jsonp("007467")
if data:
    print("基金数据获取成功:")
    print(f"基金代码: {data.get('fundcode')}")
    print(f"最新净值: {data.get('dwjz')}")
    print(f"估算值: {data.get('gsz')}")
else:
    print("数据获取失败")